/**
 * @file 地图初始化钩子
 * @description 封装地图资源初始化和依赖功能管理的核心逻辑，作为地图服务与UI组件的桥梁
 * @module hooks/map/useMapInitializer
 * @date 2024-06-28
 * @author GPS项目团队
 * 
 * @description 功能概述:
 * - 管理地图资源的初始化和加载状态
 * - 协调地图及其依赖功能的初始化流程
 * - 智能检测当前路由是否需要地图并进行按需加载
 * - 处理地图资源加载错误和重试逻辑
 * - 维护地图初始化生命周期与组件生命周期的同步
 * - 提供声明式API简化地图初始化流程
 * 
 * @requires Vue
 * @requires @/stores/modules/map
 * @requires @/stores/modules/track/cache
 * @requires @/utils/system/logger
 * 
 * @example
 * // 基本使用方式
 * const {
 *   isMapReady,
 *   isTrackReady,
 *   error,
 *   initialized,
 *   initializeMap
 * } = useMapInitializer({
 *   autoInit: true,
 *   loadTrack: true
 * });
 */
// @ts-ignore - uni-app环境下Vue导入需要忽略类型检查
import { ref, computed, onMounted, onUnmounted, nextTick, watch } from 'vue';
import { useMapStore } from '@/stores/modules/map';
import { useTrackStore } from '@/stores/modules/track';
import { logger } from '@/utils/system/logger';

/**
 * 地图初始化配置项
 */
export interface MapInitializerOptions {
  /** 是否自动初始化 */
  autoInit?: boolean;
  /** 是否加载轨迹插件 */
  loadTrack?: boolean;
  /** 是否启用重试 */
  retry?: boolean;
  /** 最大重试次数 */
  maxRetries?: number;
  /** 是否监听路由变化自动初始化 */
  watchRouteChanges?: boolean;
  /** 是否自动初始化相关功能(如轨迹缓存) */
  autoInitFeatures?: boolean;
}

/**
 * 地图初始化钩子
 * @param options 初始化配置项
 */
export function useMapInitializer(options: MapInitializerOptions = {}) {
  // 默认配置
  const defaultOptions: Required<MapInitializerOptions> = {
    autoInit: true,
    loadTrack: true,
    retry: true,
    maxRetries: 3,
    watchRouteChanges: true,
    autoInitFeatures: true
  };
  
  const opts = { ...defaultOptions, ...options };
  
  // 状态管理
  const initialized = ref(false);
  const initializing = ref(false);
  const error = ref<Error | null>(null);
  
  // Store实例
  const mapStore = useMapStore();
  let trackStore: ReturnType<typeof useTrackStore> | null = null;
  
  // 计算属性
  const isMapReady = computed(() => mapStore.isMapReady);
  const isTrackReady = computed(() => mapStore.isTrackReady);
  const isReady = computed(() => initialized.value && isMapReady.value);
  
  /**
   * 初始化地图资源
   */
  async function initializeMap(): Promise<boolean> {
    // 如果已初始化或正在初始化，则跳过
    if (initialized.value || initializing.value) {
      return isMapReady.value;
    }
    
    // 检查当前路由是否需要地图
    if (!mapStore.isMapRouteActive()) {
      logger.info('当前路由不需要地图资源');
      return false;
    }
    
    // 检查地图是否已就绪
    if (isMapReady.value) {
      logger.info('地图资源已加载');
      initialized.value = true;
      
      if (opts.autoInitFeatures) {
        initDependentFeatures();
      }
      
      return true;
    }
    
    // 开始初始化流程
    initializing.value = true;
    error.value = null;
    
    try {
      logger.info('开始加载地图资源');
      
      // 加载地图资源
      const success = await mapStore.loadMapOnDemand({
        loadTrack: opts.loadTrack,
        retry: opts.retry,
        maxRetries: opts.maxRetries
      });
      
      if (success) {
        logger.info('地图资源加载成功');
        initialized.value = true;
        
        if (opts.autoInitFeatures) {
          initDependentFeatures();
        }
      } else {
        logger.warn('地图资源加载未成功');
        error.value = new Error('地图资源加载未成功完成');
      }
      
      return success;
    } catch (err) {
      const e = err as Error;
      logger.error('地图资源加载失败', e);
      error.value = e;
      return false;
    } finally {
      initializing.value = false;
    }
  }
  
  /**
   * 初始化依赖地图的功能
   */
  function initDependentFeatures(): void {
    // 确保地图已就绪
    if (!isMapReady.value) {
      return;
    }
    
    // 初始化轨迹缓存
    initTrackCacheIfNeeded();
    
    // 可以在这里初始化其他依赖地图的功能
  }
  
  /**
   * 初始化轨迹缓存 - 仅在需要时初始化
   */
  function initTrackCacheIfNeeded(): void {
    // 只有在需要地图的路由且地图已就绪时初始化缓存
    if (mapStore.isMapRouteActive() && isMapReady.value && !trackStore) {
      logger.info('初始化轨迹缓存');
      trackStore = useTrackStore();
      nextTick(() => trackStore!.startCacheCleanup());
    }
  }
  
  /**
   * 重置地图状态
   */
  function reset(): void {
    initialized.value = false;
    initializing.value = false;
    error.value = null;
    
    cleanupResources();
  }
  
  /**
   * 清理资源
   */
  function cleanupResources(): void {
    if (trackStore) {
      trackStore.stopCacheCleanup();
      trackStore = null;
    }
  }
  
  // 监听地图状态变化
  watch(() => mapStore.isMapReady, (ready: boolean) => {
    if (ready && !initialized.value) {
      initialized.value = true;
      
      if (opts.autoInitFeatures) {
        initDependentFeatures();
      }
    }
  });
  
  // 监听轨迹插件状态变化
  watch(() => mapStore.isTrackReady, (ready: boolean) => {
    if (ready && opts.autoInitFeatures) {
      initDependentFeatures();
    }
  });
  
  // 组件挂载时自动初始化
  onMounted(() => {
    if (opts.autoInit) {
      initializeMap();
    }
  });
  
  // 组件卸载时清理
  onUnmounted(() => {
    cleanupResources();
  });
  
  // 返回公共API
  return {
    // 状态
    initialized,
    initializing,
    error,
    isMapReady,
    isTrackReady,
    isReady,
    
    // 方法
    initializeMap,
    initDependentFeatures,
    initTrackCacheIfNeeded,
    reset,
    cleanupResources
  };
} 